package com.archive.core.config;


import com.archive.core.constants.ArchiveIntervalType;
import com.archive.core.constants.ArchiveStatementMode;
import com.archive.core.constants.ArchiveStrategy;
import com.archive.core.table.ArchiveTable;
import lombok.Data;

import java.util.List;

/**
 * 归档配置
 */
@Data
public class ArchiveProperties {

    /**
     * 是否启用归档，默认关闭
     */
    private boolean enabled = false;

    /**
     * 归档周期
     */
    private Integer archiveInterval;

    /**
     * 归档周期类型，支持按天和按月归档
     * 默认按天归档
     */
    private ArchiveIntervalType archiveIntervalType = ArchiveIntervalType.DAY;

    /**
     * 归档策略，支持同库归档和备份库归档
     * 默认同库归档
     */
    private ArchiveStrategy archiveStrategy = ArchiveStrategy.SAME;

    private boolean useInsertIntoSelect = true;

    /**
     * 是否检查表是否存在，开启后会检查archiveTables表是否存在，不存在会抛出异常
     */
    private boolean checkTable = true;

    /**
     * 是否自动检查并更新表字段
     */
    private boolean checkColumns = false;

    /**
     * 归档表
     */
    private List<ArchiveTable> archiveTables;

    /**
     * 归档表后缀
     */
    private String archiveTableSuffix;

    /**
     * 归档库数据源
     */
    private String dataSourceRef;

    /**
     * 目标库数据源，用于备份库归档
     */
    private String targetDataSourceRef;

    /**
     * 归档SQL方式，NORMAL-一般方式 PREPARED-预编译方式
     */
    private ArchiveStatementMode statementMode = ArchiveStatementMode.PREPARED;

    /**
     * 归档超时时间
     */
    private int archiveTimeout = -1;

    /**
     * 批量删除使用DELETE FROM...WHERE ID IN()方式，此配置代表IN语句拼接的数据量
     */
    private Integer deleteExecuteBatchSize = 200;

    private Integer insertIntoSelectBatchSize = 500;

    /**
     * Statement方式，每条INSERT INTO...VALUES...语句，VALUES后拼接的数据量
     */
    private Integer normalInsertExecuteBatchSize = 10;

    /**
     * 锁定表表名
     */
    private String lockTableName;

    /**
     * 自动解锁时长, 单位：天
     */
    private Integer lockReleaseInterval = 1;

}
